//
// Created by mond on 2021/12/4.
//

#ifndef _OLED_H_
#define _OLED_H_

#include "i2c.h"
#include "main.h"

#define u8 uint8_t
#define u32 uint32_t

#define OLED0561_ADD 0x78 // OLED的I2C地址（禁止修改）
#define COM 0x00          // OLED 指令（禁止修改）
#define DAT 0x40          // OLED 数据（禁止修改）

/*!
 * OLED 初始化
 */
void oled_Init();

/*!
 * 全屏填充
 * @param fill_data 填充内容
 */
void oled_Fill(uint8_t fill_data);

/*!
 * 清屏
 */
void oled_Clear();

/*!
 * OLED 唤醒
 */
void oled_ON();

/*!
 * OLED 休眠
 */
void oled_OFF();

/*!
 * OLED显示一个字符
 * @param row 行位置，范围：0~3
 * @param col 列位置，范围：0~15
 * @param ch 要显示的一个字符，范围：ASCII可见字符
 */
void oled_Show_Char(uint8_t row, uint8_t col, char ch);

/*!
 * OLED 显示字符串
 * @param row 起始行位置，0~3
 * @param col 起始列位置，0~15
 * @param str 要显示的字符串，范围：ASCII可见字符
 */
void oled_Show_String(uint8_t row, uint8_t col, char *str);

/*!
 * OLED 显示数字（十进制，无符号）
 * @param row 起始行位置，范围：0~3
 * @param col 起始列位置，范围：0~15
 * @param num 要显示的数字，范围：0~4294967295
 * @param len 要显示数字的长度，范围：1~10
 */
void oled_Show_Number(uint8_t row, uint8_t col, uint32_t num, uint8_t len);

/*!
 * OLED 显示数字（十进制，有符号）
 * @param row 起始行位置，范围：0~3
 * @param col 起始列位置，范围：0~15
 * @param num 要显示的数字，范围：-2147483648~2147483647
 * @param len 要显示数字的长度，范围：1~10
 */
void oled_Show_Signed_Number(uint8_t row, uint8_t col, int32_t num, uint8_t len);

/*!
 * OLED 显示数字（十六进制，无符号）
 * @param row 起始行位置，范围：0~3
 * @param col 起始列位置，范围：0~15
 * @param num 要显示的数字，范围：0~0xFFFF FFFF
 * @param len 要显示数字的长度，范围：1~8
 */
void oled_Show_Hex_Number(uint8_t row, uint8_t col, uint32_t num, uint8_t len);

/*!
 * OLED 显示数字（二进制，无符号）
 * @param row 起始行位置，范围：0~3
 * @param col 起始列位置，范围：0~15
 * @param num 要显示的数字，范围：0~0b1111 1111 1111 1111
 * @param len 要显示数字的长度，范围：1~16
 */
void oled_Show_Bin_Number(uint8_t row, uint8_t col, uint32_t num, uint8_t len);

/*!
 * OLED 显示 BMP 图片
 * @param x0 起始列地址，范围 0~127
 * @param y0 起始页地址，范围 0~7
 * @param x1 终止列地址，范围 0~127
 * @param y1 终止页地址，范围 0~7
 * @param bmp 存放图片的数组
 */
void oled_Draw_BMP(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, const uint8_t bmp[]);

/*!
 * OLED 显示 BMP 图片
 * @param x0 起始列地址，范围 0~127
 * @param y0 起始页地址，范围 0~7
 * @param x1 终止列地址，范围 0~127
 * @param y1 终止页地址，范围 0~7
 * @param frame_num 总帧数
 * @param gif 存放 gif 的数组，1030 x frame_num 个元素。
 */
void oled_Draw_Gif(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t frame_num, const uint8_t gif[][1030]);

/*!
 * OLED 显示浮点数（十进制，有符号）
 * @param row 起始行位置，范围：0~3
 * @param col 起始列位置，范围：0~15
 * @param num 要显示的数字，范围：double 类型的范围
 * @param f_num 保留小数位数，范围：1~7
 * @param len 要显示数字的长度，范围：1~10
 */
void oled_Show_Float(uint8_t row, uint8_t col, double num, uint8_t f_num, uint8_t len);

// void WriteCmd(unsigned char I2C_Command);//写命令
// void WriteDat(unsigned char I2C_Data);//写数据
// void OLED_Init(void);//初始化
// void OLED_SetPos(unsigned char x, unsigned char y);
// void OLED_Fill(unsigned char fill_Data);//全屏填充
// void OLED_CLS(void);
// void OLED_ON(void);
// void OLED_OFF(void);
// void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[],
// unsigned char TextSize);//显示字符串 void OLED_ShowCN(unsigned char x,
// unsigned char y, unsigned char N);//显示汉字 void OLED_DrawBMP(unsigned char
// x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char
// BMP[]);//显示图片
//
// void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size);
// u32 oled_pow(u8 m,u8 n);
// void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2);//size2(16|12)

#endif // _OLED_H_
